﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ApplicationGenerator.CommonModule;
using System.Collections.Specialized;

namespace ApplicationGenerator.CommonWeb
{
    /// <summary>
    /// Klasa do obsługi historii stron webowych
    /// </summary>
    public class WebPagesHistory
    {
        #region Fields
        /// <summary>
        /// Historia wywoływanych stron
        /// </summary>
        private IList<WebPageHistoryElement> _history;

        /// <summary>
        /// Klucz obiektu historii w sesji użytkownika
        /// </summary>
        public readonly static string HistorySessionKeyName = "HistorySessionKey";
        #endregion

        #region Constructor
        /// <summary>
        /// Konstruktor
        /// </summary>
        public WebPagesHistory()
        {
            _history = new List<WebPageHistoryElement>();
        }
        #endregion

        #region Methods
        /// <summary>
        /// Dodaje stronę do historii
        /// </summary>
        public void AddToHistory(string actualWebPageUrl, NameValueCollection querryParams)
        {
            WebPageHistoryElement element = new WebPageHistoryElement();
            element.WebPageUrl = actualWebPageUrl;
            element.InitializeQuerryParams(querryParams);

            if (CheckConditions(element))
            {
                _history.Add(element);
            }
        }

        /// <summary>
        /// Pobiera poprzednią stronę z historii
        /// </summary>
        /// <returns>Url poprzedniej strony z historii</returns>
        public string GetPreviousPage(string actualWebPageUrl, NameValueCollection querryParams)
        {
            if (IsHistoryEmpty())
            {
                throw new Exception("Nie można wykonać akcji cofnij, jeśli nie ma wpisów w historii przeglądania. Błędna konfiguracja aplikacji");
            }

            WebPageHistoryElement element = new WebPageHistoryElement();
            element.WebPageUrl = actualWebPageUrl;
            element.InitializeQuerryParams(querryParams);


            if (element.IsLoadFormPage())
                if (LastElement().IsFormPage() && LastElement().FormGuid() == element.FormGuid())
                {
                    _history.Remove(LastElement());
                }

            if (element.IsListPage())
            {
                if (LastElement().IsListPage() && LastElement().ListGuid() == element.ListGuid())
                {
                    _history.Remove(LastElement());
                }
            }

            if (IsHistoryEmpty())
            {
                throw new Exception("Nie można wykonać akcji cofnij, jeśli nie ma wpisów w historii przeglądania. Błędna konfiguracja aplikacji");
            }

            WebPageHistoryElement historyElement = _history[_history.Count - 1];
            _history.Remove(historyElement);

            return historyElement.WebPageUrl;
        }

        /// <summary>
        /// Sprawdza, czy można dodać stronę do historii
        /// </summary>
        /// <param name="element">Element aktualnie żądanej strony</param>
        /// <returns>Czy można dodać stronę do historii ?</returns>
        private bool CheckConditions(WebPageHistoryElement element)
        {
            if (!IsPageTypeAllowed(element))
            {
                return false;
            }

            if (IsHistoryEmpty())
            {
                return true;
            }

            if (element.IsListPage())
            {
                if (LastElement().IsListPage() && LastElement().ListGuid() == element.ListGuid())
                {
                    return false;
                }

                return true;
            }

            if (element.IsLoadFormPage())
            {
                if (LastElement().IsFormPage() && LastElement().FormGuid() == element.FormGuid())
                {
                    return false;
                }

                return true;
            }

            return false;
        }

        /// <summary>
        /// Czy typ strony jest dozwolony
        /// </summary>
        /// <param name="element">Element historii</param>
        /// <returns>Czy typ strony jest dozwolony ?</returns>
        private bool IsPageTypeAllowed(WebPageHistoryElement element)
        {
            return !(element.IsWorkflowPage() || element.IsRelationPage() || element.IsNewFormPage());
        }

        /// <summary>
        /// Czy historia jest pusta
        /// </summary>
        /// <returns>Czy historia jest pusta ?</returns>
        private bool IsHistoryEmpty()
        {
            return _history.Count == 0;
        }

        /// <summary>
        /// Pobiera ostatni element w historii
        /// </summary>
        /// <returns>Ostatni element w historii</returns>
        private WebPageHistoryElement LastElement()
        {
            return _history[_history.Count - 1];
        }
        #endregion
    }

}
